package com.dys.designpattern.singleton;

/**
 * @author 田建松
 * @version V1.0.0
 * @description 2.单例模式-懒汉式(线程安全)
 *              使用synchronized锁，锁住单例对象创建的方法，防止多个线程同时调用
 * @date 2024/5/9
 * @since 1.0
 */
public class SafeThreadLazySingleton {

    /**
     * 1.私有化构造器
     */
    private SafeThreadLazySingleton() {
        // 防止反射破坏
        if (instance!=null) {
            throw new RuntimeException("不允许非法访问");
        }
    }

    /**
     * 2.私有化内部实例
     */
    private static SafeThreadLazySingleton instance;

    /**
     * 3.公有静态方法用来获取内部实例,通过添加synchronize,保证多线程模式下的单例对象的唯一性
     *
     * @return 内部实例
     */
    public static synchronized SafeThreadLazySingleton getInstance() {
        if (instance == null) {
            instance = new SafeThreadLazySingleton();
        }
        return instance;
    }

    /**
     * 防止反序列化对于单例模式的破坏
     */
    private Object readResolve() {
        return instance;
    }
}
